// axios-instance.js - axios 全局封装

// 创建 axios 实例
const axiosInstance = axios.create({
    // 基础路径
    baseURL: '/',
    // 超时时间
    timeout: 5000
});

// 请求拦截器
axiosInstance.interceptors.request.use(config => {
    // 在请求头中自动注入 Token
    const token = localStorage.getItem('token'); // 假设 Token 存储在 localStorage 中
    if (token) {
        config.headers['Authorization'] = `Bearer ${token}`; // 在请求头中添加 token
    }
    return config;
}, error => {
    // 请求错误统一处理
    console.error('请求出错', error); // 可以进行全局日志记录
    return Promise.reject(error);
});

// 响应拦截器
axiosInstance.interceptors.response.use(response => {
    const data = response.data; // 从完整的响应对象（response）中提取 data 属性
    // 响应数据状态检查,这里的200返回统一响应的code
    if (!data || data.code !== 200) {     // 使用可选链防止 undefined
        const msg = data.message || '操作失败';
        message.warning(`[${data.code}]:[${data.message}, ${data.data}]`)
        // showMessage('warning', `[${data.code}]:[${data.message}, ${data.data}]`)
        // 主动抛出包含错误信息的 拒绝状态 Promise，强制后续调用进入.catch() 进行统一错误处理。
        return Promise.reject(new Error(msg));
    }
    return data; // 返回完统一响应对象，如{code:200, message:'success', data:{...}}
}, error => {
    handleNetworkError(error);
    return Promise.reject(error);
});


// 网络错误处理
function handleNetworkError(error) {
    if (!error.response) {
        showMessage('error', '网络连接异常，请检查网络设置');
        return;
    }

    const status = error.response.status;
    switch (status) {
        case 401:
            localStorage.clear();
            router.replace('/login?redirect=' + encodeURIComponent(router.currentRoute.value.fullPath));
            break;
        case 403:
            showMessage('warning', '权限不足，请联系管理员');
            break;
        case 500:
            showMessage('error', '服务器内部错误');
            break;
        default:
            showMessage('error', `请求错误 [${status}]`);
    }
}



const showMessage = (type, message) => {
    ElementPlus.ElMessage({
        type,
        message,
        duration: 5000,
        showClose: true
        // grouping: true // 合并相同内容的消息
    });
};

